package com.dzq.utils
{
public class Lunar
{
	private static var date:Date;
	public static var lyear:String;
	public static var lmonth:String;
	public static var lday:String;
	public static var ldate:String;
	/*****************************************************************************
	                                   日期资料
	*****************************************************************************/
	
	private static var lunarInfo:Array =new Array(
	0x04bd8,0x04ae0,0x0a570,0x054d5,0x0d260,0x0d950,0x16554,0x056a0,0x09ad0,0x055d2,
	0x04ae0,0x0a5b6,0x0a4d0,0x0d250,0x1d255,0x0b540,0x0d6a0,0x0ada2,0x095b0,0x14977,
	0x04970,0x0a4b0,0x0b4b5,0x06a50,0x06d40,0x1ab54,0x02b60,0x09570,0x052f2,0x04970,
	0x06566,0x0d4a0,0x0ea50,0x06e95,0x05ad0,0x02b60,0x186e3,0x092e0,0x1c8d7,0x0c950,
	0x0d4a0,0x1d8a6,0x0b550,0x056a0,0x1a5b4,0x025d0,0x092d0,0x0d2b2,0x0a950,0x0b557,
	0x06ca0,0x0b550,0x15355,0x04da0,0x0a5b0,0x14573,0x052b0,0x0a9a8,0x0e950,0x06aa0,
	0x0aea6,0x0ab50,0x04b60,0x0aae4,0x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0,
	0x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b6a0,0x195a6,
	0x095b0,0x049b0,0x0a974,0x0a4b0,0x0b27a,0x06a50,0x06d40,0x0af46,0x0ab60,0x09570,
	0x04af5,0x04970,0x064b0,0x074a3,0x0ea50,0x06b58,0x055c0,0x0ab60,0x096d5,0x092e0,
	0x0c960,0x0d954,0x0d4a0,0x0da50,0x07552,0x056a0,0x0abb7,0x025d0,0x092d0,0x0cab5,
	0x0a950,0x0b4a0,0x0baa4,0x0ad50,0x055d9,0x04ba0,0x0a5b0,0x15176,0x052b0,0x0a930,
	0x07954,0x06aa0,0x0ad50,0x05b52,0x04b60,0x0a6e6,0x0a4e0,0x0d260,0x0ea65,0x0d530,
	0x05aa0,0x076a3,0x096d0,0x04bd7,0x04ad0,0x0a4d0,0x1d0b6,0x0d250,0x0d520,0x0dd45,
	0x0b5a0,0x056d0,0x055b2,0x049b0,0x0a577,0x0a4b0,0x0aa50,0x1b255,0x06d20,0x0ada0,
	0x14b63);
	
	private static var solarMonth:Array = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
	private static var Gan:Array = new Array("甲","乙","丙","丁","戊","己","庚","辛","壬","癸");
	private static var Zhi:Array = new Array("子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥");
	private static var Animals:Array = new Array("鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪");
	private static var solarTerm:Array = new Array("小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至");
	private static var sTermInfo:Array = new Array(0,21208,42467,63836,85337,107014,128867,150921,173149,195551,218072,240693,263343,285989,308563,331033,353350,375494,397447,419210,440795,462224,483532,504758);
	private static var nStr1:Array = new Array('日','一','二','三','四','五','六','七','八','九','十');
	private static var nStr2:Array = new Array('初','十','廿','卅','□');
	private static var monthName:Array = new Array("JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC");
	private static var days:Array =new Array('星期日','星期一','星期二','星期三','星期四','星期五','星期六');
	
	public static function setDate(_date:Date):void{
		date = _date;
		//trace(date)
		var isLeap:Boolean = false;
		var year:int;
		var month:int;
		var day:int;
		
		var i:int;
		var leap:int=0;
		var temp:int=0;
		var offset:int   = (Date.UTC(date.getFullYear(),date.getMonth(),date.getDate()) - Date.UTC(1900,0,31))/86400000;
		//trace(offset) //39579
		for(i=1900; i<2050 && offset>0; i++) { temp=lYearDays(i); offset-=temp; }
		//trace(offset) //-228
		if(offset<0) { offset+=temp; i--; }
		//trace('year: ' + i) //2008
		year = i;
		leap = leapMonth(i); //闰哪个月
		//trace('闰月: ' + leap)
		
		for(i=1; i<13 && offset>0; i++) {
		//闰月
		if(leap>0 && i==(leap+1) && isLeap==false)
		{ --i; isLeap = true; temp = leapDays(year); }
		else
		{ temp = monthDays(year, i); }
		
		//解除闰月
		if(isLeap==true && i==(leap+1)) isLeap = false;
		
		offset -= temp;
		}
		//trace(offset) //-21
		
		if(offset==0 && leap>0 && i==leap+1)
		if(isLeap)
		{ isLeap = false; }
		else
		{ isLeap = true; --i; }
		
		if(offset<0){ offset += temp; --i; }
		
		month = i;
		day = offset + 1;
		var str:String = '农历' + cyclical(year-1900+36) + '年【'+Animals[(year-4)%12]+'年】' + cMonth(month, isLeap) + ' ' + cDay(day);
		//trace(str)
		lyear = cyclical(year-1900+36) + '年';
		lmonth = cMonth(month, isLeap);
		ldate = cDay(day);
		lday = days[date.day];
	}
	
	public static function getLunarStr():String{
		
		return lyear + lmonth + ldate;
	}
	//====================================== 返回农历 y年的总天数
	private static function lYearDays(y:int):int{
		var i:int, sum:int = 348;
		for(i=0x8000; i>0x8; i>>=1) sum += (lunarInfo[y-1900] & i)? 1: 0;
		return(sum+leapDays(y));
	}
	
	//====================================== 返回农历 y年闰月的天数
	private static function leapDays(y:int):int {
		if(leapMonth(y))  return((lunarInfo[y-1900] & 0x10000)? 30: 29);
		else return(0);
	}
	
	//====================================== 返回农历 y年闰哪个月 1-12 , 没闰返回 0
	private static function leapMonth(y:int):int {
		return(lunarInfo[y-1900] & 0xf);
	}
	
	//====================================== 返回农历 y年m月的总天数
	private static function monthDays(y:int ,m:int):int {
		return( (lunarInfo[y-1900] & (0x10000>>m))? 30: 29 );
	}
	//==============================返回公历 y年某m+1月的天数
	private static function solarDays(y:int, m:int):int {
		if(m==1)
		return(((y%4 == 0) && (y%100 != 0) || (y%400 == 0))? 29: 28);
		else
		return(solarMonth[m]);
	}
	//============================== 传入 offset 返回干支, 0=甲子
	private static function cyclical(num:int):String {
		return(Gan[num%10]+Zhi[num%12]);
	}
	//====================== 中文日期
	private static function cDay(d:int):String{
		var s:String;
		
		switch (d) {
			case 10:
				s = '初十'; 
				break;
			case 20:
				s = '二十'; 
				break;
			case 30:
				s = '三十';
				break;
			default :
				s = nStr2[Math.floor(d/10)];
				s += nStr1[d%10];
		}
		return s;
	}
	
	//=====================中文月份
	private static function cMonth(month:int, isLeap:Boolean):String{
		
		var months:Array = new Array('一','二','三','四','五','六','七','八','九','十','十一','十二');
		var s:String = months[month-1] + '月';
		if(isLeap)s = '闰'+s;
		return s;
	}
	
	
	//===== 某年的第n个节气为几日(从0小寒起算)
	private static function sTerm(y:int, n:int):int {
		var offDate:Date = new Date( ( 31556925974.7*(y-1900) + sTermInfo[n]*60000  ) + Date.UTC(1900,0,6,2,5) );
		return(offDate.getUTCDate());
	}

}
}